package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;

import co.gov.medellin.ssti.sub.model.dao.RepDetBeneficiarioDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.BeneficiarioVO;
import co.gov.medellin.ssti.sub.model.vo.CondicionConsultaVO;
import co.gov.medellin.ssti.sub.model.vo.RepAtributoVO;
import co.gov.medellin.ssti.sub.model.vo.RepDetBeneficiarioVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteDetVO;

public class RepDetBeneficiarioDAOImpl2 extends NamedParameterJdbcDaoSupport
		implements RepDetBeneficiarioDAO {

	private static final String SELECT_COUNT_BENEFICIARIOS = "SELECT COUNT(1) "
			+ " FROM(SELECT TO_CHAR(beneotor.FECHA_BENEFICIO,'DD/MM/RRRR') fechabeneficio, "
			+ " beneotor.CODIGO codbeneotor, beneotor.BEN_CODIGO codbeneficiario, "
			+ " sede.CODIGO codsede, "
			+ " sede.NOMBRE nomsede, prog.CODIGO codpro, prog.NOMBRE nompro, "
			+ " subpro.CODIGO codsubpro, subpro.NOMBRE nomsubpro "
			+ " FROM TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA subpro, "
			+ " TCS_BEN_BENEFICIO_OTORGADO beneotor, TCS_BEN_SEDE sede, "
			+ " TCS_BEN_BENEFICIARIO beneficiario "
			+ " WHERE beneotor.SBPR_CODIGO = subpro.CODIGO "
			+ " AND beneotor.SEDE_CODIGO = sede.CODIGO "
			+ " AND subpro.PRG_CODIGO = prog.CODIGO "
			+ " AND beneficiario.CODIGO = beneotor.BEN_CODIGO "
			+ " AND beneotor.FECHA_BENEFICIO <= sysdate "
			+ " AND prog.vigencia='A' and subpro.vigencia='A' ";

	private static final String CALL_CANTIDAD_BENEFICIARIOS = "{call beneficios.PCS_CANTIDAD_BENEFICIARIOS(?, '' , ?, ?, ?, ?, ?, ?)}";

	private static final String CALL_REPORTE_BENEFICIARIOS = "{call beneficios.PCS_REPORTE_BENEFICIARIOS(?, ?, ?, ?, ?, ?, ?, ?)}";

	private static final String SELECT_NOMBRE_SEDE_BY_CODIGO = "SELECT NOMBRE FROM TCS_BEN_SEDE WHERE CODIGO = :CODIGO ";

	private static final String SELECT_NOMBRE_PROGRAMA_BY_CODIGO = "SELECT NOMBRE FROM TCS_BEN_PROGRAMA WHERE CODIGO = :CODIGO ";

	private static final String SELECT_NOMBRE_SUBPROGRAMA_BY_CODIGO = "SELECT NOMBRE FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO = :CODIGO ";

	public int findCantidadBeneficiariosByCriteria(RepDetBeneficiarioVO criteria) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer(SELECT_COUNT_BENEFICIARIOS);
		int cantidad = 0;

		if ((Object) criteria.getCodeSede() != null) {
			query.append(" AND sede.CODIGO = :sede.CODIGO ");
			namedParameters.put("sede.CODIGO", criteria.getCodeSede());
		}
		if ((Object) criteria.getCodeSubprograma() != null) {
			query.append(" AND subpro.CODIGO = :subpro.CODIGO ");
			namedParameters.put("subpro.CODIGO", criteria.getCodeSubprograma());
		}
		if ((Object) criteria.getCodePrograma() != null) {
			query.append(" AND prog.CODIGO = :prog.CODIGO ");
			namedParameters.put("prog.CODIGO", criteria.getCodePrograma());
		}
		if ((Object) criteria.getDesde() != null
				&& (Object) criteria.getHasta() != null) {
			query.append(" AND beneotor.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE, 'dd/mm/rrrr')"
					+ "AND TO_DATE(:HASTA,'dd/mm/rrrr')");
			namedParameters.put("DESDE", criteria.getDesde());
			namedParameters.put("HASTA", criteria.getHasta());

		}
		query.append(" ORDER BY prog.NOMBRE,subpro.NOMBRE,sede.NOMBRE )");

		try {
			cantidad = getNamedParameterJdbcTemplate().queryForObject(
					query.toString(), namedParameters, Integer.class);
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: throw?
		}
		return cantidad;
	}

	// TODO: refactor this
	public Integer findCantidadBeneficiariosByFiltrosAndCriteria(
			List<CondicionConsultaVO> filtros, RepDetBeneficiarioVO criteria) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String filtrosGenerales = checkFiltros((Collection<CondicionConsultaVO>) filtros);
		String desde = null;
		String hasta = null;
		if (criteria != null) {
			if (criteria.getDesde() != null && !criteria.getDesde().isEmpty()) {
				desde = criteria.getDesde();
			}
			if (criteria.getHasta() != null && !criteria.getHasta().isEmpty()) {
				hasta = criteria.getHasta();
			}
		}

		String strSql = "{call beneficios.PCS_CANTIDAD_BENEFICIARIOS(" + ""
				+ filtrosGenerales + ", '' , " + criteria.getCodeSede() + ", "
				+ criteria.getCodeSubprograma() + ", "
				+ criteria.getCodePrograma() + "," + desde + ", " + hasta
				+ ", ?)}";

		namedParameters.put("filtrosGenerales", filtrosGenerales);
		namedParameters.put("filtrosEspecificos", "");
		namedParameters.put("codigoSede", criteria.getCodeSede());
		namedParameters.put("codigoSub", criteria.getCodeSubprograma());
		namedParameters.put("codigoProg", criteria.getCodePrograma());
		namedParameters.put("fechaInicio", desde);
		namedParameters.put("fechaFinal", hasta);

		SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getDataSource())
				.withSchemaName("BENEFICIOS")
				.withProcedureName("PCS_CANTIDAD_BENEFICIARIOS")
				.returningResultSet("c_resultado", new RowMapper<Integer>() {

					@Override
					public Integer mapRow(ResultSet rs, int arg1)
							throws SQLException {
						Integer ret = rs.getInt(1);
						return ret;
					}
				});

		SqlParameterSource in = new MapSqlParameterSource()
				.addValues(namedParameters);
		Map<String, Object> out = jdbcCall.execute(in);

		@SuppressWarnings("unchecked")
		List<Integer> ret = (ArrayList<Integer>) out.get("c_resultado");

		return ret.get(0);

		// SqlParameterSource in = new MapSqlParameterSource(namedParameters);
		// Map<String, Object> simpleJdbcCallResult = jdbcCall.execute(in);
		// ResultSet rs = (ResultSet) simpleJdbcCallResult.get("c_resultado");
		//
		// try {
		// rs.next();
		// return (new Integer(rs.getInt(1)));
		// } catch (SQLException e) {
		// // TODO Auto-generated catch block
		// throw new DAOException(e);
		// }

	}

	public Collection<BeneficiarioVO> findReporte(
			Collection<RepAtributoVO> atributosGenericos,
			Collection<CondicionConsultaVO> filtros,
			RepDetBeneficiarioVO criteria) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		Collection<BeneficiarioVO> beneficiarios = new LinkedList<BeneficiarioVO>();
		List<RepAtributoVO> latributosGenericos = (List<RepAtributoVO>) atributosGenericos;

		RepAtributoVO atrVO = null;

		StringBuffer atriGenerales = new StringBuffer();
		String filtrosGenerales = checkFiltros(filtros);
		String desde = null;
		String hasta = null;
		if (criteria != null) {
			if (criteria.getDesde() != null && !criteria.getDesde().isEmpty()) {
				desde = criteria.getDesde();
			}
			if (criteria.getHasta() != null && !criteria.getHasta().isEmpty()) {
				hasta = criteria.getHasta();
			}
		}

		if (latributosGenericos.size() > 0) {
			for (int i = 0; i < latributosGenericos.size(); i++) {
				atrVO = (RepAtributoVO) latributosGenericos.get(i);
				atriGenerales.append(atrVO.getNombre() + "|");
			}

		}

		String strSql = "{call beneficios.PCS_REPORTE_BENEFICIARIOS('"
				+ atriGenerales + "', " + "'" + filtrosGenerales + "', "
				+ criteria.getCodeSede() + ", " + criteria.getCodeSubprograma()
				+ ", " + criteria.getCodePrograma() + ", " + desde + ", "
				+ hasta + ", ? )}";

		System.out.println(strSql);

		final StringBuffer atrGen = new StringBuffer(atriGenerales.toString());
		final RepDetBeneficiarioVO crit = criteria;

		SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getDataSource())
				.withSchemaName("BENEFICIOS")
				.withProcedureName("PCS_REPORTE_BENEFICIARIOS")
				.returningResultSet("c_resultado",
						new RowMapper<BeneficiarioVO>() {

							@Override
							public BeneficiarioVO mapRow(ResultSet rs, int arg1)
									throws SQLException {
								BeneficiarioVO vo = new BeneficiarioVO();
								if (atrGen != null) {
									if (atrGen.indexOf("TIPO_DOCUMENTO") != -1) {
										vo.setTipoDocumento(rs
												.getString("TIPO_DOCUMENTO"));
									}
									if (atrGen.indexOf("NUMERO_DOCUMENTO") != -1) {
										vo.setNumeroDocumento(rs
												.getString("NUMERO_DOCUMENTO"));
									}
									if (atrGen.indexOf("PRIMER_NOMBRE") != -1) {
										vo.setNombre1(rs
												.getString("PRIMER_NOMBRE"));
									}
									if (atrGen.indexOf("SEGUNDO_NOMBRE") != -1) {
										vo.setNombre2(rs
												.getString("SEGUNDO_NOMBRE"));
									}
									if (atrGen.indexOf("PRIMER_APELLIDO") != -1) {
										vo.setPrimerApellido(rs
												.getString("PRIMER_APELLIDO"));
									}
									if (atrGen.indexOf("SEGUNDO_APELLIDO") != -1) {
										vo.setSegundoApellido(rs
												.getString("SEGUNDO_APELLIDO"));
									}
									if (atrGen.indexOf("DIRECCION_DESCRIPTIVA") != -1) {
										vo.setDirDescriptiva(rs
												.getString("DIRECCION_DESCRIPTIVA"));
									}
									if (atrGen.indexOf("DIRECCION_ENCASILLADA") != -1) {
										vo.setDirEncasillada(rs
												.getString("DIRECCION_ENCASILLADA"));
									}
									if (atrGen.indexOf("SEXO") != -1) {
										vo.setSexo(rs.getString("SEXO"));
									}
									if (atrGen.indexOf("FECHA_NACIMIENTO") != -1) {
										vo.setFechaNacimiento(rs
												.getString("FECHA_NACIMIENTO"));
									}
									if (atrGen.indexOf("VFL_CODIGO_COMUNA") != -1) {
										vo.setVflComuna(rs
												.getString("VFL_CODIGO_COMUNA"));
									}
									if (atrGen.indexOf("VFL_CODIGO_ZONA") != -1) {
										vo.setDescZona(rs
												.getString("VFL_CODIGO_ZONA"));
									}
									if (atrGen.indexOf("LOCALIZACION_COBAMA") != -1) {
										vo.setCobama(rs
												.getString("LOCALIZACION_COBAMA"));
									}
									if (atrGen.indexOf("VFL_CODIGO_BARRIO") != -1) {
										vo.setDescBarrio(rs
												.getString("VFL_CODIGO_BARRIO"));
									}
									if (atrGen.indexOf("HECHO_VICTIMIZANTE") != -1) {
										vo.setHechoVictimizante(rs
												.getString("HECHO_VICTIMIZANTE"));
									}
									if (atrGen.indexOf("TELEFONO") != -1) {
										vo.setTelefono(rs.getString("TELEFONO"));
									}
									if (atrGen.indexOf("ETNIA") != -1) {
										vo.setEtnia(rs.getString("ETNIA"));
									}
									if (atrGen.indexOf("CORREO_ELECTRONICO") != -1) {
										vo.setMail(rs
												.getString("CORREO_ELECTRONICO"));
									}
									if (atrGen.indexOf("FICHA_SISBEN") != -1) {
										vo.setFichaSisben(rs
												.getString("FICHA_SISBEN"));
									}
									if (atrGen.indexOf("HOGAR_SISBEN") != -1) {
										vo.setHogar(rs
												.getString("HOGAR_SISBEN"));
									}
									if (atrGen.indexOf("ORDEN_SISBEN") != -1) {
										vo.setOrdenSisben(rs
												.getString("ORDEN_SISBEN"));
									}
									if (atrGen.indexOf("NIVEL_SISBEN") != -1) {
										vo.setNivelSisben(rs
												.getString("NIVEL_SISBEN"));
									}
									if (atrGen.indexOf("PUNTAJE_SISBEN") != -1) {
										vo.setPuntajeSisben(rs
												.getString("PUNTAJE_SISBEN"));
									}
									if (atrGen.indexOf("FE_ENCUESTA_SISBEN") != -1) {
										vo.setFechaEncuesta(rs
												.getString("FE_ENCUESTA_SISBEN"));
									}
									if (atrGen.indexOf("DISCAPACIDAD_SISBEN") != -1) {
										vo.setDiscapacidad(rs
												.getString("DISCAPACIDAD_SISBEN"));
									}
									if (atrGen.indexOf("EDAD") != -1) {
										vo.setEdad(rs.getString("EDAD"));
									}
									if (crit.getCodePrograma() == null
											&& crit.getCodeSubprograma() == null
											&& crit.getCodeSede() != null) {
										vo.setPrograma(rs
												.getString("NOMBRE_PROGRAMA"));
										vo.setBeneficio(rs
												.getString("NOMBRE_SUBPROGRAMA"));

									} else if (crit.getCodePrograma() != null
											&& crit.getCodeSubprograma() == null) {
										vo.setBeneficio(rs
												.getString("NOMBRE_SUBPROGRAMA"));
									}
								}
								return vo;
							}
						});
		// namedParameters.put("CamposGenerales", filtrosGenerales);
		namedParameters.put("CamposGenerales", atriGenerales);
		namedParameters.put("filtrosGenerales", filtrosGenerales);
		namedParameters.put("codigoSede", criteria.getCodeSede());
		namedParameters.put("codigoSub", criteria.getCodeSubprograma());
		namedParameters.put("codigoProg", criteria.getCodePrograma());
		namedParameters.put("fechaInicio", desde);
		namedParameters.put("fechaFinal", hasta);

		System.out.println(namedParameters.toString());

		// Map<String, Object> simpleJdbcCallResult = jdbcCall.execute(in);
		// ResultSet rs = (ResultSet)
		// simpleJdbcCallResult.get("c_resultado");
		SqlParameterSource in = new MapSqlParameterSource()
				.addValues(namedParameters);
		Map<String, Object> out = jdbcCall.execute(in);

		@SuppressWarnings("unchecked")
		Collection<BeneficiarioVO> ret = (ArrayList<BeneficiarioVO>) out
				.get("c_resultado");
		// Iterator<ReporteDetVO> it = ret.iterator();
		// BeneficiarioVO beneficiarioVO = null;
		//
		// while (it.hasNext()) {
		// beneficiarioVO = new BeneficiarioVO();
		// if (atriGenerales != null) {
		// if (atriGenerales.indexOf("TIPO_DOCUMENTO") != -1) {
		// beneficiarioVO.setTipoDocumento(rs
		// .getString("TIPO_DOCUMENTO"));
		// }
		// if (atriGenerales.indexOf("NUMERO_DOCUMENTO") != -1) {
		// beneficiarioVO.setNumeroDocumento(rs
		// .getString("NUMERO_DOCUMENTO"));
		// }
		// if (atriGenerales.indexOf("PRIMER_NOMBRE") != -1) {
		// beneficiarioVO
		// .setNombre1(rs.getString("PRIMER_NOMBRE"));
		// }
		// if (atriGenerales.indexOf("SEGUNDO_NOMBRE") != -1) {
		// beneficiarioVO.setNombre2(rs
		// .getString("SEGUNDO_NOMBRE"));
		// }
		// if (atriGenerales.indexOf("PRIMER_APELLIDO") != -1) {
		// beneficiarioVO.setPrimerApellido(rs
		// .getString("PRIMER_APELLIDO"));
		// }
		// if (atriGenerales.indexOf("SEGUNDO_APELLIDO") != -1) {
		// beneficiarioVO.setSegundoApellido(rs
		// .getString("SEGUNDO_APELLIDO"));
		// }
		// if (atriGenerales.indexOf("DIRECCION_DESCRIPTIVA") != -1) {
		// beneficiarioVO.setDirDescriptiva(rs
		// .getString("DIRECCION_DESCRIPTIVA"));
		// }
		// if (atriGenerales.indexOf("DIRECCION_ENCASILLADA") != -1) {
		// beneficiarioVO.setDirEncasillada(rs
		// .getString("DIRECCION_ENCASILLADA"));
		// }
		// if (atriGenerales.indexOf("SEXO") != -1) {
		// beneficiarioVO.setSexo(rs.getString("SEXO"));
		// }
		// if (atriGenerales.indexOf("FECHA_NACIMIENTO") != -1) {
		// beneficiarioVO.setFechaNacimiento(rs
		// .getString("FECHA_NACIMIENTO"));
		// }
		// if (atriGenerales.indexOf("VFL_CODIGO_COMUNA") != -1) {
		// beneficiarioVO.setVflComuna(rs
		// .getString("VFL_CODIGO_COMUNA"));
		// }
		// if (atriGenerales.indexOf("VFL_CODIGO_ZONA") != -1) {
		// beneficiarioVO.setDescZona(rs
		// .getString("VFL_CODIGO_ZONA"));
		// }
		// if (atriGenerales.indexOf("LOCALIZACION_COBAMA") != -1) {
		// beneficiarioVO.setCobama(rs
		// .getString("LOCALIZACION_COBAMA"));
		// }
		// if (atriGenerales.indexOf("VFL_CODIGO_BARRIO") != -1) {
		// beneficiarioVO.setDescBarrio(rs
		// .getString("VFL_CODIGO_BARRIO"));
		// }
		// if (atriGenerales.indexOf("TELEFONO") != -1) {
		// beneficiarioVO.setTelefono(rs.getString("TELEFONO"));
		// }
		// if (atriGenerales.indexOf("ETNIA") != -1) {
		// beneficiarioVO.setEtnia(rs.getString("ETNIA"));
		// }
		// if (atriGenerales.indexOf("CORREO_ELECTRONICO") != -1) {
		// beneficiarioVO.setMail(rs
		// .getString("CORREO_ELECTRONICO"));
		// }
		// if (atriGenerales.indexOf("FICHA_SISBEN") != -1) {
		// beneficiarioVO.setFichaSisben(rs
		// .getString("FICHA_SISBEN"));
		// }
		// if (atriGenerales.indexOf("HOGAR_SISBEN") != -1) {
		// beneficiarioVO.setHogar(rs.getString("HOGAR_SISBEN"));
		// }
		// if (atriGenerales.indexOf("ORDEN_SISBEN") != -1) {
		// beneficiarioVO.setOrdenSisben(rs
		// .getString("ORDEN_SISBEN"));
		// }
		// if (atriGenerales.indexOf("NIVEL_SISBEN") != -1) {
		// beneficiarioVO.setNivelSisben(rs
		// .getString("NIVEL_SISBEN"));
		// }
		// if (atriGenerales.indexOf("PUNTAJE_SISBEN") != -1) {
		// beneficiarioVO.setPuntajeSisben(rs
		// .getString("PUNTAJE_SISBEN"));
		// }
		// if (atriGenerales.indexOf("FE_ENCUESTA_SISBEN") != -1) {
		// beneficiarioVO.setFechaEncuesta(rs
		// .getString("FE_ENCUESTA_SISBEN"));
		// }
		// if (atriGenerales.indexOf("DISCAPACIDAD_SISBEN") != -1) {
		// beneficiarioVO.setDiscapacidad(rs
		// .getString("DISCAPACIDAD_SISBEN"));
		// }
		// if (atriGenerales.indexOf("EDAD") != -1) {
		// beneficiarioVO.setEdad(rs.getString("EDAD"));
		// }
		// if (criteria.getCodePrograma() == null
		// && criteria.getCodeSubprograma() == null
		// && criteria.getCodeSede() != null) {
		// beneficiarioVO.setPrograma(rs
		// .getString("NOMBRE_PROGRAMA"));
		// beneficiarioVO.setBeneficio(rs
		// .getString("NOMBRE_SUBPROGRAMA"));
		//
		// } else if (criteria.getCodePrograma() != null
		// && criteria.getCodeSubprograma() == null) {
		// beneficiarioVO.setBeneficio(rs
		// .getString("NOMBRE_SUBPROGRAMA"));
		// }
		// }
		//
		// beneficiarios.add(beneficiarioVO);
		// }
		return ret;

		// return beneficiarios;
	}

	public RepDetBeneficiarioVO findFiltros(
			RepDetBeneficiarioVO repDetBeneficiarioVO) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String consulta = null;

		if (repDetBeneficiarioVO.getCodeSede() != null) {
			consulta = SELECT_NOMBRE_SEDE_BY_CODIGO;
			try {

				namedParameters.put("CODIGO",
						repDetBeneficiarioVO.getCodeSede());
				String nombre = getNamedParameterJdbcTemplate().queryForObject(
						consulta, namedParameters, String.class);
				if (nombre != null) {
					repDetBeneficiarioVO.setNombreSede(nombre);
				}
			} catch (IncorrectResultSizeDataAccessException e) {
				// TODO: throw? throw new DAOException(e);
			}
		}
		if (repDetBeneficiarioVO.getCodePrograma() != null) {
			consulta = SELECT_NOMBRE_PROGRAMA_BY_CODIGO;
			try {
				namedParameters.clear();
				namedParameters.put("CODIGO",
						repDetBeneficiarioVO.getCodePrograma());
				String nombre = getNamedParameterJdbcTemplate().queryForObject(
						consulta, namedParameters, String.class);
				if (nombre != null) {
					repDetBeneficiarioVO.setNombrePrograma(nombre);
				}
			} catch (IncorrectResultSizeDataAccessException e) {
				// TODO: throw? throw new DAOException(e);
			}
		}
		if (repDetBeneficiarioVO.getCodeSubprograma() != null) {
			consulta = SELECT_NOMBRE_SUBPROGRAMA_BY_CODIGO;
			try {
				namedParameters.clear();
				namedParameters.put("CODIGO", repDetBeneficiarioVO
						.getCodeSubprograma().longValue());
				String nombre = getNamedParameterJdbcTemplate().queryForObject(
						consulta, namedParameters, String.class);
				if (nombre != null) {
					repDetBeneficiarioVO.setNombreSubprograma(nombre);
				}
			} catch (IncorrectResultSizeDataAccessException e) {
				// TODO: throw ? throw new DAOException(e);
			}
		}
		return repDetBeneficiarioVO;
	}

	private String checkFiltros(Collection<CondicionConsultaVO> filtros) {
		List<CondicionConsultaVO> lFiltros = (List<CondicionConsultaVO>) filtros;
		CondicionConsultaVO filtro = null;
		StringBuffer retorno = new StringBuffer();
		if ((Object) filtros != null) {
			for (int i = 0; i < lFiltros.size(); i++) {
				filtro = lFiltros.get(i);
				String operador = filtro.getCodFiltro();
				String tipoDato = filtro.getTipoCampo();

				if (filtro.getOrigen().equals("G")) {
					retorno.append(" AND ");
					if (tipoDato.equals("N")) {
						if (operador.equals("=")) {
							retorno.append(" ben." + filtro.getCodcampo() + " "
									+ operador + " " + filtro.getValor());
						} else if (operador.equals("<>")) {
							retorno.append(" ben." + filtro.getCodcampo() + " "
									+ operador + " " + filtro.getValor());
						} else if (operador.equals("<=")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " " + filtro.getValor());
						} else if (operador.equals(">=")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " " + filtro.getValor());
						} else if (operador.equals("<")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " " + filtro.getValor());
						} else if (operador.equals(">")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " " + filtro.getValor());
						} else {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " " + filtro.getValor()
									+ " and " + filtro.getValor2());
						}
					} else if (tipoDato.equals("F")) {
						if (operador.equalsIgnoreCase("between")
								|| operador.equals("=")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " TO_DATE('"
									+ filtro.getValor()
									+ "', 'DD/MM/RRRR') AND TO_DATE('"
									+ filtro.getValor2() + "', 'DD/MM/RRRR')");
						} else {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " to_date('"
									+ filtro.getValor() + "', 'DD/MM/RRRR')");
						}
					} else if (tipoDato.equals("A") || tipoDato.equals("L")) {
						if (operador.equals("=")) {
							retorno.append(" UPPER(ben." + filtro.getCodcampo()
									+ " ) " + operador + " '"
									+ filtro.getValor().toUpperCase() + "'");
						} else if (operador.equals("<>")) {
							retorno.append(" UPPER(ben." + filtro.getCodcampo()
									+ " ) " + operador + " '"
									+ filtro.getValor().toUpperCase() + "'");
						} else if (operador.equalsIgnoreCase("like")) {
							retorno.append(" UPPER(ben." + filtro.getCodcampo()
									+ " ) " + operador + " '%"
									+ filtro.getValor().toUpperCase() + "%'");
						}
					} else {
						if (operador.equals("=")) {
							retorno.append(" ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor() + "'");
						} else if (operador.equals("<>")) {
							retorno.append(" ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor() + "'");
						} else if (operador.equals("<=")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor() + "'");
						} else if (operador.equals(">=")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor() + "'");
						} else if (operador.equals("<")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor() + "'");
						} else if (operador.equals(">")) {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor() + "'");
						} else {
							retorno.append("ben." + filtro.getCodcampo() + " "
									+ operador + " '" + filtro.getValor()
									+ "' and '" + filtro.getValor2() + "'");
						}
					}
				}
			}
		}
		return retorno.toString();
	}

}
